package com.syg.servlet02;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 文件下载
 * 文件下载功能的实现思路：
 *　　1.获取要下载的文件的绝对路径
 *　　2.获取要下载的文件名
 *　　3.设置content-disposition响应头控制浏览器以下载的形式打开文件
 *　　4.获取要下载的文件输入流
 *　　5.创建数据缓冲区
 *　　6.通过response对象获取OutputStream流
 *　　7.将FileInputStream流写入到buffer缓冲区
 *　　8.使用OutputStream将缓冲区的数据输出到客户端浏览器
 * 注意：
 *      如果文件名包含中文,要使用URLEncoder.encode(fileName, "字符编码"),避免出现乱码
 */
@WebServlet("/downLoad")
public class _04_DownLoadFile extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取要下载的文件的绝对路径
        String filePath = this.getServletContext().getRealPath("/Images/BrowserRead.png");
        //2.获取要下载的文件名
        String fileName = filePath.substring(filePath.lastIndexOf("\\")+1);
        //3.设置content-disposition响应头控制浏览器以下载的形式打开文件
        resp.setHeader("content-disposition", "attachment;filename="+fileName);
        //4.获取要下载的文件输入流
        InputStream in = new FileInputStream(filePath);
        //5.创建数据缓冲区
        byte[] bufferByte = new byte[1024];
        //6.通过response对象获取OutputStream流
        OutputStream respOut = resp.getOutputStream();
        //7.将FileInputStream流写入到buffer缓冲区
        int len = 0;
        while ((len=in.read(bufferByte))>0){
            //8.使用OutputStream将缓冲区的数据输出到客户端浏览器
            respOut.write(bufferByte,0,len);
        }
        in.close();
    }
}
